<?php
namespace Utils;

/**
 * Ajax消息返回类
 */
class AjaxMsg {
    private $mlist;
    public function __construct(){
        $this->mlist = [
            'focus' => [],
            'msg' => [],
            'notification' => [],
            'data' => [],
            'location' => false,
            'status' => 0,
        ];
    }

    /**
     * 增加文本框焦点信息
     * @param string $id 文本框ID
     * @param bool $level 验证是否通过
     * @param string $msg 信息
     * @return AjaxMsg 链式操作
     */
    public function addFocus(string $id, bool $level, string $msg = ''): self {
        $index = count($this->mlist['focus']);
        $this->mlist['focus'][$index] = [$level, $id, $msg];
        return $this;
    }
    
    /**
     * 删除文本框焦点信息
     * @param string $id 文本框ID
     * @return AjaxMsg 链式操作
     */
    public function removeFocus(string $id): self {
        if(is_int($id)){
            if(isset($this->mlist['focus'][$id])){
                unset($this->mlist['focus'][$id]);
            }
        } else {
            $length = count($this->mlist['focus']);
            for($i = 0; $i < $length; $i ++){
                if($this->mlist['focus'][$i][1] == $id){
                    unset($this->mlist['focus'][$i]);
                    break;
                }
            }
        }
        return $this;
    }

    /**
     * 获取所有文本框焦点信息
     * @return array 所有文本框焦点信息的列表
     */
    public function getFocuses(): array {
        return $this->mlist['focus'];
    }

    /**
     * 获取一条文本框焦点信息
     * @param string $id 文本框ID
     * @return array 文本框焦点信息
     */
    public function getFocus(string $id): array {
        if(is_int($id)){
            if(isset($this->mlist['focus'][$id])){
                return $this->mlist['focus'][$id];
            }
        } else {
            $length = count($this->mlist['focus']);
            for($i = 0; $i < $length; $i ++){
                if($this->mlist['focus'][$i][1] == $id){
                    return $this->mlist['focus'][$i];
                }
            }
        }
    }
    
    /**
     * 增加消息
     * @param string $level 消息类型
     * @param string $code 消息代码
     * @param string $title 标题
     * @param string $content 内容
     * @return AjaxMsg 链式操作
     */
    public function addMsg(string $level, string $code, string $title, string $content): self {
        $id = count($this->mlist['msg']);
        $this->mlist['msg'][$id] = [$level, $code, $title, $content];
        return $this;
    }
    
    /**
     * 删除消息
     * @param string $id 消息代码
     * @return AjaxMsg 链式操作
     */
    public function removeMsg(string $id): self {
        if(is_int($id)){
            if(isset($this->mlist['msg'][$id])){
                unset($this->mlist['msg'][$id]);
            }
        } else {
            $length = count($this->mlist['msg']);
            for($i = 0; $i < $length; $i ++){
                if($this->mlist['msg'][$i][2] == $id){
                    unset($this->mlist['msg'][$i]);
                    break;
                }
            }
        }
        return $this;
    }

    /**
     * 获取所有消息
     * @return array 消息列表
     */
    public function getMsgs(): array {
        return $this->mlist['msg'];
    }

    /**
     * 获取单条消息
     * @param string $id 消息代码
     * @return array 消息内容
     */
    public function getMsg(string $id): array {
        if(is_int($id)){
            if(isset($this->mlist['msg'][$id])){
                return $this->mlist['msg'][$id];
            }
        } else {
            $length = count($this->mlist['msg']);
            for($i = 0; $i < $length; $i ++){
                if($this->mlist['msg'][$i][2] == $id){
                    return $this->mlist['msg'][$i];
                }
            }
        }
    }
    
    /**
     * 增加通知
     * @param string $level 通知id
     * @param string $title 标题
     * @param string $content 内容
     * @param string $url 点击通知后跳转到的url
     * @param bool $override 是否覆盖原有通知
     * @param string $icon 通知图标
     * @return AjaxMsg 链式操作
     */
    public function addNotification(string $id, string $title, string $content, string $url = '', bool $override = false, string $icon = '/static/images/icon.png'): self {
        $index = count($this->mlist['notification']);
        $this->mlist['notification'][$index] = [$id, $title, $content, $url, $override, $icon];
        return $this;
    }
    
    /**
     * 删除一条通知
     * @param string $id 通知id
     * @return AjaxMsg 链式操作
     */
    public function removeNotification(string $id): self {
        if(is_int($id)){
            if(isset($this->mlist['notification'][$id])){
                unset($this->mlist['notification'][$id]);
            }
        } else {
            $length = count($this->mlist['notification']);
            for($i = 0; $i < $length; $i ++){
                if($this->mlist['notification'][$i][1] == $id){
                    unset($this->mlist['notification'][$i]);
                    break;
                }
            }
        }
        return $this;
    }

	/**
     * 获取所有通知的列表
     * @return array 通知列表
     */
    public function getNotifications(): array {
        return $this->mlist['notification'];
    }

	/**
     * 获取一条通知
     * @param string $id 通知id
     * @return array 通知内容
     */
    public function getNotification(string $id): array {
        if(is_int($id)){
            if(isset($this->mlist['notification'][$id])){
                return $this->mlist['notification'][$id];
            }
        } else {
            $length = count($this->mlist['notification']);
            for($i = 0; $i < $length; $i ++){
                if($this->mlist['notification'][$i][1] == $id){
                    return $this->mlist['notification'][$i];
                }
            }
        }
    }

	/**
     * 增加validate验证器的error
     * @param array $error 错误列表
     * @return AjaxMsg 链式操作
     */
    public function setValidateError(array $error): self {
        $this->setStatus = 0;
        foreach($error as $key => $one){
            $this->addMsg('error', 'ERR::INCORRECT_' . strtoupper($key), '错误', $one);
            $this->addFocus(false, $key, $one);
        }
        return $this;
    }
	
	/**
     * 设置重定向目标
     * @param string $url 重定向目标
     * @return AjaxMsg 链式操作
     */
    public function setLocation(string $url): self {
        $this->mlist['location'] = $url;
        return $this;
    }

	/**
	 * 获取重定向目标
	 * @return string 重定向目标
	 */
    public function getLocation(): string {
        return $this->mlist['location'];
    }
	
	/**
	 * 设置状态码
	 * @param int $status 状态码
     * @return AjaxMsg 链式操作
	 */
    public function setStatus(int $status): self {
        $this->mlist['status'] = $status;
        return $this;
    }

	/**
	 * 获取状态码
	 * @return int 状态码
	 */
    public function getStatus(): int {
        return $this->mlist['status'];
    }

	/**
	 * 设置附加信息
	 * @param array $extraData 附加信息
     * @return AjaxMsg 链式操作
	 */
    public function setData(array $extraData): self {
        $this->mlist['data'] = $extraData;
        return $this;
    }

	/**
	 * 获取附加信息
	 * @return array 附加信息
	 */
    public function getData(): array {
        return $this->mlist['data'];
    }
    
    public function __toString(): string {
        return json_encode($this->mlist);
    }
	
	/**
	 * 转为json
	 * @return string json数据
	 */
    public function getJson(): string{
        return $this->__toString();
    }
}